#include "content_node.h"
#include <stdlib.h>  // 包含free、malloc、NULL的声明
#include <string.h>  // 包含memcpy的声
#include <stdio.h>


// 注意要加（）否则优先级不对，比如 传入&conn_list->prev，实际上是这样 &(conn_list->prev)，所以要加个括号
// 插入节点：将item插入到链表末尾（头节点的前一个位置，即原末尾节点之后）
#define CONTENT_LIST_INSERT_TAIL(item, list)                                                  \
    do                                                                                \
    {                                                                                 \
        (item)->prev = (list)->prev; /* 新节点的前序指向原末尾节点（头节点的prev） */ \
        (item)->next = (list);       /* 新节点的后序指向头节点（维持循环） */         \
        (list)->prev->next = (item); /* 原末尾节点的后序指向新节点 */                 \
        (list)->prev = (item);       /* 头节点的前序指向新节点（新节点成为末尾） */   \
    } while (0)

// 删除节点：从链表中移除item（item为数据节点，非头节点）
#define CONTENT_LIST_REMOVE(item, list)                                                             \
    do                                                                                      \
    {                                                                                       \
        (item)->prev->next = (item)->next; /* item的前序节点的后序指针指向item的后序节点 */ \
        (item)->next->prev = (item)->prev; /* item的后序节点的前序指针指向item的前序节点 */ \
        (item)->prev = NULL;               /* 清理item的前序指针 */                         \
        (item)->next = NULL;               /* 清理item的后序指针 */                         \
    } while (0)

// 初始化链表头节点
#define CONTENT_LIST_INIT(list)                                    \
    do                                                     \
    {                                                      \
        (list)->next = (list); /* 头节点的后序指向自己 */  \
        (list)->prev = (list); /* 头节点的前序指向自己 */  \
        (list)->length = 0;    /* 头节点的长度初始化为0 */ \
    } while (0)

// 判断链表是否为空
#define CONTENT_LIST_EMPTY(list) ((list)->next == (list) && (list)->prev == (list))


int list_init(node* list)
{
    CONTENT_LIST_INIT(list);
}


// 清空链表
int clear_list(node *list)
{
    node *current = list->next;
    while (current != list)
    {
        node *temp = current;
        current = current->next;
        kvs_free(temp);
    }

    // 重新初始化头节点
    CONTENT_LIST_INIT(list);
    return 0;
}

// 插入链表
int insert_list(char *buffer, int len, node *list)
{
    node *new_node = (node *)kvs_malloc((sizeof(node) + len) * sizeof(char));

    memcpy(new_node->data, buffer, len);
    new_node->length = len;

    list->length += len;

    CONTENT_LIST_INSERT_TAIL(new_node, list);
    return 0;
}

int delete_node(node* n, node *list)
{
    CONTENT_LIST_REMOVE(n, list);
    kvs_free(n);
}

int list_empty(node* list)
{
    return CONTENT_LIST_EMPTY(list);
}


// 展示链表的内容
int print_list(node *list)
{
    node *current = list->next;
    while (current != list)
    {
        printf("%.*s", current->length, current->data);
        current = current->next;
        printf("\n");
    }

    return 0;
}